--DOTween常用工具
--2017/11/13
--http://dotween.demigiant.com/getstarted.php 方法参考地址

module("UI.DOTweenMgr", package.seeall)

--type       控件类型 可为transform、material、AudioSource、Rigidbody、comment等
--position   位置（Vector3等）
--duration   动作持续时间
--loopTimes  动作循环次数 为 -1 时为无限循环
--snapping   bool 为true时将平滑地将所有值捕捉到整数
function DTDOMove(type, position, duration, loopTimes, snapping, callback_start,callback_Complete, time,easeType)
    if type ~= nil then
        local ease_type = DG.Tweening.Ease.OutQuint
        if easeType == 1 then
            ease_type = DG.Tweening.Ease.Linear
        elseif easeType == 2 then
            --ease_type = DG.Tweening.Ease.OutQuint
        elseif easeType == 3 then
            ease_type = DG.Tweening.Ease.InOutQuad
        elseif easeType==4 then --先慢后快
            ease_type = DG.Tweening.Ease.InQuint
        elseif easeType==5 then
            ease_type = DG.Tweening.Ease.InSine
        else
            ease_type = DG.Tweening.Ease.OutQuint
        end
       
        local tween = type.transform:DOLocalMove(position, duration, snapping)
        tween:SetEase(ease_type)
         --过程动作效果，加速度，减速度等 可参考动态效果 http://robertpenner.com/easing/easing_demo.html
         --过程动作效果，加速度，减速度等 可参考动态效果 http://robertpenner.com/easing
        tween:SetLoops(loopTimes, DG.Tweening.LoopType.Restart) -- DG.Tweening.LoopType 循环方式
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Yoyo)
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Incremental)
        if callback_start ~= nil then
            tween:OnStart(UIHelper.CreateTweenCallback(callback_start))
        end
        if callback_Complete ~= nil then
            tween:OnComplete(UIHelper.CreateTweenCallback(callback_Complete))       
        end

        if time > 0 then
         --结束时回调，需要在C#处理回调
            tween:SetDelay(time)
        end
        return tween
    end
end

function DTDONotceMove(type, position, duration, loopTimes, snapping, callback_start,callback_Complete, time)
    if type ~= nil then
        local tween = type.transform:DOLocalMove(position, duration, snapping)
        tween:SetEase(DG.Tweening.Ease.Linear)
         --过程动作效果，加速度，减速度等 可参考动态效果 http://robertpenner.com/easing/easing_demo.html
        tween:SetLoops(loopTimes, DG.Tweening.LoopType.Restart) -- DG.Tweening.LoopType 循环方式
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Yoyo)
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Incremental)
        if callback_start ~= nil then
            tween:OnStart(UIHelper.CreateTweenCallback(callback_start))
        end
        if callback_Complete ~= nil then
            tween:OnComplete(UIHelper.CreateTweenCallback(callback_Complete))       
        end

        if time > 0 then
         --结束时回调，需要在C#处理回调
            tween:SetDelay(time)
        end

        return tween
    end
end

function DTDORot(type, eluerAngle, duration, loopTimes, callback_start,callback_Complete, time)
    if type ~= nil then
        local tween = type.transform:DOLocalRotate(eluerAngle, duration, DG.Tweening.RotateMode.Fast)
        tween:SetEase(DG.Tweening.Ease.OutQuint)
         --过程动作效果，加速度，减速度等 可参考动态效果 http://robertpenner.com/easing/easing_demo.html
        tween:SetLoops(loopTimes, DG.Tweening.LoopType.Restart) -- DG.Tweening.LoopType 循环方式
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Yoyo)
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Incremental)
         tween:OnStart(UIHelper.CreateTweenCallback(callback_start))
        tween:OnComplete(UIHelper.CreateTweenCallback(callback_Complete))       
         --结束时回调，需要在C#处理回调
        tween:SetDelay(time)
    end
end
 

--旋转超过360
function DTDORot360(type, eluerAngle, duration, loopTimes, callback_start,callback_Complete, time)
    if type ~= nil then
        local tween = type.transform:DOLocalRotate(eluerAngle, duration, DG.Tweening.RotateMode.FastBeyond360)
        tween:SetEase(DG.Tweening.Ease.OutQuart)
         --过程动作效果，加速度，减速度等 可参考动态效果 http://robertpenner.com/easing/easing_demo.html
        tween:SetLoops(loopTimes, DG.Tweening.LoopType.Restart) -- DG.Tweening.LoopType 循环方式
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Yoyo)
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Incremental)
         tween:OnStart(UIHelper.CreateTweenCallback(callback_start))
        tween:OnComplete(UIHelper.CreateTweenCallback(callback_Complete))       
         --结束时回调，需要在C#处理回调
        tween:SetDelay(time)
    end
end

function DTDORotNotFast(type, eluerAngle, duration, loopTimes, callback_start,callback_Complete,time,callback_addBack,addBackTime)
    if type ~= nil then
        local sequence = DG.Tweening.DOTween.Sequence()
        
        -- sequence:SetEase(DG.Tweening.Ease.OutQuint)
        -- sequence:SetLoops(loopTimes, DG.Tweening.LoopType.Restart)
        -- sequence:OnStart(UIHelper.CreateTweenCallback(callback_start))
        -- sequence:OnComplete(UIHelper.CreateTweenCallback(callback_Complete))  
        -- sequence:SetDelay(time)    
        --SetEase(DG.Tweening.Ease.OutQuint):
        sequence:Append(type.transform:DOLocalRotate(eluerAngle, duration, DG.Tweening.RotateMode.FastBeyond360):
        SetLoops(loopTimes, DG.Tweening.LoopType.Restart):OnStart(UIHelper.CreateTweenCallback(callback_start)):OnComplete(UIHelper.CreateTweenCallback(callback_Complete))
        :SetDelay(time)) 
        sequence:InsertCallback(addBackTime, callback_addBack)
        --结束时回调，需要在C#处理回调
        
        -- local tween = type.transform:DOLocalRotate(eluerAngle, duration, DG.Tweening.RotateMode.WorldAxisAdd)
        -- tween:SetEase(DG.Tweening.Ease.OutQuint)
        --  --过程动作效果，加速度，减速度等 可参考动态效果 http://robertpenner.com/easing/easing_demo.html
        -- tween:SetLoops(loopTimes, DG.Tweening.LoopType.Restart) -- DG.Tweening.LoopType 循环方式
        -- --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Yoyo)
        -- --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Incremental)
        --  tween:OnStart(UIHelper.CreateTweenCallback(callback_start))
        -- tween:OnComplete(UIHelper.CreateTweenCallback(callback_Complete)) 
        --  --结束时回调，需要在C#处理回调
        -- tween:SetDelay(time)
    end
end


--type       控件类型
--position   Vector3,或者缩放倍数（float）
--duration   动作持续时间
--callback   回调函数
function DTScale(type, position, duration, loopTimes, callback)
    if type ~= nil then
        local scale = type.transform:DOScale(position, duration)
        scale:SetLoops(loopTimes, DG.Tweening.LoopType.Yoyo)
        scale:OnComplete(UIHelper.CreateTweenCallback(callback))
     --结束时回调，需要在C#处理回调
    --scale:OnStart(UIHelper.CreateTweenCallback(callback)) -- 开始的回调
    end
end

--按照指定坐标点的路径运动
function DTDOPath(type)
    local positions = {
        Vector3.New(10, 0, 0),
        Vector3.New(5, 4, 0),
        Vector3.New(0, 10, 0),
        Vector3.New(0, 4, 0)
    }
    if type ~= nil then
        local path =
            type.transform:DOPath(
            positions,
            4,
            DG.Tweening.PathType.CatmullRom,
            DG.Tweening.PathMode.Full3D,
            10,
            Color.Green
        )
        path:SetEase(DG.Tweening.Ease.Linear)
        path:SetLoops(-1, DG.Tweening.LoopType.Yoyo)
    end
end

--color  颜色
function DTDOColor(type, color, duration)
    if type ~= nil then
        local mat = type.transform.Getcomponent(Render).material
        if mat ~= nil then
            local dtColor = mat:DOColor(color, duration)
            dtColor:Pause() --暂停tween的使用 可以由 Play 函数启用
            dtColor:SetLoops(-1)
        end
    end
end

--多种组合同时作用
--atPosition 在哪个位置开始插入另一个tween
function DTCombainFunc(type, position1, position2, duration1, duration2, loopTimes, snapping, atPosition, callback)
    if type ~= nil then
        local sequence = DG.Tweening.DOTween.Sequence()
        sequence:Append(type.transform:DOLocalMove(position1, duration1, snapping)) --Append 添加一个Tween
        sequence:Insert(atPosition, type.transform:DOScale(position2, duration2))
         --Insert 在atPosition处 插入一个Tween
        sequence:SetLoops(loopTimes, DG.Tweening.LoopType.Yoyo)
    end
end

---透明度改变
function DTDOFade(type,duration,alphaValue,callback_start,callback_Complete,time)
    if type ~= nil then 
        local tween = type:DOFade(alphaValue,duration)
        tween:SetEase(DG.Tweening.Ease.OutQuint)
        tween:SetLoops(1, DG.Tweening.LoopType.Restart) -- DG.Tweening.LoopType 循环方式
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Yoyo)
        --tween:SetLoops(loopTimes,DG.Tweening.LoopType.Incremental)
        if callback_start ~= nil then
            tween:OnStart(UIHelper.CreateTweenCallback(callback_start))
        end
        if callback_Complete ~= nil then
            tween:OnComplete(UIHelper.CreateTweenCallback(callback_Complete))       
        end

        if time > 0 then
         --结束时回调，需要在C#处理回调
            tween:SetDelay(time)
        end
    end
end
